// 接口是一系类抽象方法的声明，是一些方法特征的集合，这些方法都是抽象的，需要具体的类来实现，然后第三方就可以通过这组抽象方法的调用，让具体的类执行具体的方法，（接口来定义变量类型）
// 类似下面的代码 通过别名来限制类型
type myType = {
  name: string;
  age: number;
};
var p1: myType = {
  name: "张三",
  age: 20,
};
// 但是通过type不能重复声明，接口可以重复声明
// 
interface Person {
  name: string;
  age: number;
  hobby: string | string[];
  getName: () => string;
}
interface Person{
  gender:string
}
var coder: Person = {
  name: "张三",
  age: 20,
  gender: "男",
  hobby: "敲代码",
  getName: (): string => {
    return coder.name;
  },
};
console.log(coder.hobby);
console.log(coder.getName());
var pro: Person = {
  name: "李四",
  age: 18,
  gender:"男",
  hobby: ["敲代码"],
  getName: (): string => {
    return pro.name;
  },
};
console.log(pro.hobby);

// 接口和数组  接口中我们可以将数组的索引值和元素设置为不同类型，索引值可以是数字或字符串。
interface nameList {
  [index: number]: string;
}
let list: nameList = ["hello", "world"];
// let list2:nameList = [1,2,3]  报错

// 接口在定义类的时候可以去限制类的结构
// 接口中所有属性都不能有实际的值，接口只定义对象的结构，而不考虑实际值
// 接口中所有的方法都是抽象方法
// 接口和继承
// 接口继承就是说接口可以通过其他接口来扩展自己 extends  单接口和多接口继承
interface Animal {
  name: string;
  age: number;
}
interface Cat extends Animal {
  eat: () => void;
}
var buou = <Cat>{};
buou.name = "TS";
buou.age = 1;
buou.eat = () => {
  console.log("ts eat");
};
buou.eat();

interface Dog {
  sayHello: () => void;
}
interface Erha extends Animal, Dog {}
var js: Erha = {
  name: "",
  age: 2,
  sayHello: () => {
    console.log("hello World ");
  },
};
js.sayHello();
